# -*- coding: utf-8 -*-
"""
@Time    : 2024/9/13 15:24 
@Author  : ZhangShenao 
@File    : 4.类方法.py 
@Desc    : 类方法

类方法与静态方法类型,它同样与类的对象无关,而是属于整个类
但是与静态方法不同的是,静态方法完全无状态,但是类方法需要与当前类的元数据对象进行交互
(类本身也是一个对象,有的地方也称之为类的元数据对象)

使用@classmethod装饰器,可以声明类方法
类方法的第一个参数约定名为cls
代表当前类的元数据对象
"""
from time import localtime, time, sleep


class Clock:
    """数字时钟类"""

    def __init__(self, hour: int = 0, minute: int = 0, second: int = 0):
        """
        构造函数
        :param hour: 时
        :param minute: 分
        :param second: 秒
        """

        # 初始化时分秒
        # 属性采用_开头,表示约定为私有属性,但是在语法层面没有强制校验
        self._hour = hour
        self._minute = minute
        self._second = second

    # 使用@classmethod装饰器,可以声明类方法
    # 类方法的第一个参数约定名为cls,代表当前类的元数据对象
    @classmethod
    def from_now(cls):
        """
        类方法,使用当前时间创建Clock对象
        :return:
        """

        # 获取当前时间
        now = localtime(time())

        # 使用类的元数据对象cls,来创建对象
        return cls(hour=now.tm_hour, minute=now.tm_min, second=now.tm_sec)

    def tick(self):
        """
        时钟走秒
        """

        # 更新时、分、秒
        self._second += 1
        if self._second >= 60:
            self._second = 0
            self._minute += 1
            if self._minute >= 60:
                self._minute = 0
                self._hour += 1
                if self._hour >= 24:
                    self._hour = 0

    def print_time(self):
        """
        打印时间
        """

        print(f"当前时间为: {self._hour:02d}:{self._minute:02d}:{self._second:02d}")


if __name__ == '__main__':
    # 调用类方法,创建对象
    clock = Clock.from_now()

    while True:
        clock.print_time()
        sleep(1)
        clock.tick()
